package day001;

public class Code03_OddTimes {

    //找出数组中出现奇数次的元素值
    public static void printOddTimes(int[] arr){
        int eor = 0;
        for(int a : arr){
            eor ^= a;
        }
        System.out.println(eor);
    }

    //找出数组中出现奇数次的两个元素值，a,b
    public static void printTwoOddTimes(int[] arr){
        int eor = 0;
        for(int a : arr){
            eor ^= a;
        }
        // 此时eor = a^b
        // 可知 a ≠ b ， a^b ≠ 0
        // eor 必然存在一个位子是 1


        int rightOne = eor & (~eor + 1); //提取最右边的 1

        int onlyOne = 0;
        for (int cur : arr){
            if((cur & rightOne) == 0){  //这里==0判断的是    rightOne 1 位置上为零的全部数
                onlyOne ^= cur;
            }
        }

        System.out.println(onlyOne + " " +(eor ^ onlyOne));
    }

    public static void main(String[] args) {
        int[] arr = {1,1,1,1,2,2,2,3,3};
        printOddTimes(arr);
        int[] arr2 = {1,1,1,2,2,3,4,4,4,4};
        printTwoOddTimes(arr2);
    }
}
